package com.cskaoyan.javase.oop3._2inner._3local._1basic;

/**
 * 关于局部内部类的访问特点：
 *      1.外围类仍然把局部内部类当"好兄弟"，局部内部类访问外围类成员仍不受权限限制。
 *          但局部内部类的作用域已被限制死了，外围类中只有装着局部内部类的作用域内，能访问到该局部内部类。
 *      2.外部类已经完全无法访问到局部内部类了。
 *
 * 局部内部类的访问特点，我们仍然主要从以下几个角度研究：
 *      1.局部内部类内部访问外围类(重点)
 *          局部内部类中访问外围类,访问的位置是局部内部类中的成员方法,因为它没有静态方法
 *          在局部内部类的成员方法中,访问外围类,也是要分情况的:
 *              a.外围类成员方法中的局部内部类
 *                  此时存在外围类的对象,这时的局部内部类就类似于成员内部类
 *                  这时局部内部类的对象会持有外围类对象的引用,作为自身成员
 *                  这时访问外围类可以"直接访问"
 *                  如果存在同名成员,用"外围类类名.this"指向外围类对象区分.
 *                  并且访问不受权限限制
 *
 *              b.外围类静态成员方法的局部内部类
 *                  此时不存在外围类的对象,这时的局部内部类就类似于静态内部类
 *                  这时的局部内部类对象和外围类对象之间是相对独立的关系,互相没有依赖
 *                  这时访问外围类需要创建外围类对象
 *                  然后再访问
 *                  并且访问不受权限限制
 *
 *      2.外围类访问局部内部类成员(了解)
 *          只能在有访问权限的局部位置
 *          直接创建局部内部类的对象,才能够访问
 *          并且访问不受权限限制.
 *
 *      3.外部类访问局部内部类成员(了解)
 *          外部类是无法直接访问局部内部类的,所以基本上是没法访问的
 *      4.局部内部类访问外部类成员(了解)
 *          可以访问,new对象即可,并且全程都受权限限制
 *
 *
 *
 *
 * @since 10:43
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        EnclosedClazz ec = new EnclosedClazz();
        ec.testMember();
        EnclosedClazz.testStatic();
    }
}

class EnclosedClazz {
    int a = 10;
    private int b = 20;
    static int c = 30;
    static final int D = 40;

    // 外围类的成员方法
    public void testMember() {
        /*
            外围类的成员方法中,定义的局部内部类
            这时的局部内部类类似于成员内部类,会持有外围类对象的引用作为自身成员
          */
        class LocalInnerClazz {
            int a = 100;
            private int b = 200;
            static final int D = 400;

            // 外围类的成员方法中,定义的局部内部类的,成员方法
            public void testInner(int a) {
                System.out.println(a);
                System.out.println(this.a);
                System.out.println(EnclosedClazz.this.a);
                System.out.println(b);
            }
        }
        // 局部内部类的使用,必须在作用域内部创建对象
        LocalInnerClazz ic = new LocalInnerClazz();
        ic.testInner(666);
    }

    // 外围类的静态成员方法
    public static void testStatic() {
        // 外围类的静态成员方法中,定义的局部内部类
        class LocalInnerClazz {
            int a = 100;
            private int b = 200;
            static final int D = 400;

            // 外围类的静态成员方法中,定义的局部内部类的,成员方法
            public void testInner(int a) {
                System.out.println(a);
                System.out.println(this.a);
                // System.out.println(EnclosedClazz.this.a);
                EnclosedClazz ec = new EnclosedClazz();
                System.out.println(ec.b);
            }
        }
        // 局部内部类的使用,必须在作用域内部创建对象
        LocalInnerClazz ic = new LocalInnerClazz();
        ic.testInner(777);
    }

}